﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.Common;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Pigmalion.BusinessEntities; 

namespace Pigmalion.DataAccess
{
    public partial class ProductoRepository : MasterDAABRepository, IProductoRepository
    {
        ICategoriaRepository categoriaFactory;
        List<Categoria> listCategoria;

        public ProductoRepository()
            : base()
        { 
            categoriaFactory = new CategoriaRepository();
        }

        public List<Producto> GetAllFromProduto()
        {
            var productos = this.PigmalionDatabase.ExecuteSprocAccessor<Producto>("GetAllFromProducto",MappBuilderFactory());

            return productos.ToList(); 

        }

        private IRowMapper<Producto> MappBuilderFactory()
        {
            //ICategoriaRepository categoriaFactory = new CategoriaRepository();

            listCategoria = categoriaFactory.GetAllFromCategoria();

            IRowMapper<Producto> rowMapper = 
                MapBuilder<Producto>.MapAllProperties()
                .MapByName(p=>p.Id)
                .MapByName(p=>p.Codigo)
                .MapByName(p=>p.Descripcion)
                .MapByName(p=>p.CategoriaId)
                //.Map(p=>p.Image).ToColumn("foto")
                //.DoNotMap(p=>p.Categoria)
                //.Map(p=>p.Categoria).WithFunc(p=>categoriaFactory.GetFromCategoriaById(p.GetInt32(1)))
                .Map(p => p.Categoria).WithFunc(p=>GetCategoriaById(p.GetInt32(1)))
                .Build();

            return rowMapper;
        }

        private Categoria GetCategoriaById(int idCategoria)
        {
            var query = from c in listCategoria
                        where c.Id == idCategoria
                        select c;

            return query.SingleOrDefault();
        }


        public List<Producto> GetFromProdutoByDescripcion(string criterio)
        {
            var productos = this.PigmalionDatabase.ExecuteSprocAccessor<Producto>("GetFromProductoByDescripcion", MappBuilderFactory(),criterio);

            return productos.ToList(); 
        }


        public void RegistrarProducto(Producto producto)
        {
            DbCommand command = this.PigmalionDatabase.GetStoredProcCommand("RegistrarProducto");
            
            DbParameter param = command.CreateParameter();
            param.ParameterName = "id";
            param.Value = producto.Id;
            param.Direction = System.Data.ParameterDirection.InputOutput;

            command.Parameters.Add(param);
           
            PigmalionDatabase.AddInParameter(command, "categoriaId", DbType.Int32, producto.CategoriaId);
            PigmalionDatabase.AddInParameter(command, "codigo ", DbType.String, producto.Codigo);
            PigmalionDatabase.AddInParameter(command, "descripcion", DbType.String, producto.Descripcion);
            PigmalionDatabase.AddInParameter(command, "precio", DbType.Decimal, producto.Precio);
            PigmalionDatabase.AddInParameter(command, "stock", DbType.Decimal, producto.Stock);

            PigmalionDatabase.ExecuteNonQuery(command);

            producto.Id = (Int32)param.Value;

        }


        public Producto GetFromProductoByCodigo(string criterio)
        {
            var producto = this.PigmalionDatabase.ExecuteSprocAccessor<Producto>("GetFromProductoByCodigo", MappBuilderFactory(), criterio);

            return producto.SingleOrDefault();
        }
    }
}
